#ifndef __DATA_PARSE_H
#define __DATA_PARSE_H
#include "stdint.h"

#define PROTOCOL_HEAD  0xF3
#define PROTOCOL_TAIL  0xF4

// 0x00: 流控/心跳
// 0x01: 单包发送
// 0x02: 分片起始包
// 0x03:分片中间包
// 0x04:分片末尾包
// 0x05:请求响应包
// 0x07:预留

// 低四位 应答报文
// 0x08: 流控/心跳
// 0x09: 分片接收正常
// 0x0a: 要求重发
// 0x0b:接收超时
// 0x0c:包接收正常
// 0x0f:预留

/* 低四位请求报文 */
#define SINGLE_PACKAGE               0x01 //单包发送
#define FRAGMENT_START_PACKAGE       0x02 //分片起始
#define FRAGMENT_INPROCESS_PACKAGE   0x03 //分片中间包
#define FRAGMENT_TAIL_PACKAGE        0x04 //分片结束

/* 低四位应答报文 */
#define FLOW_CTRL_RESPONSE           0x08 //流控/心跳
#define SINGLE_PACKAGE_NORMAL        0x09 //分片接收正常
#define RESEND_RESPONSE              0x0a //要求重发
#define RECEIVE_TIMEOUT              0x0b //接收超时
#define TOAL_PACKAGE_NOMAL           0x0c //包接收正常

#define PROTOCOL_ID_FOR_SPI          0x02

typedef enum
{
    FIRST_FIND_HEAD = 0,

}parseFlow_e;

#pragma pack(1)

typedef struct 
{
    uint8_t head;
    uint8_t  checkHead;
    union 
    {
        struct
        {
            uint8_t len1;
            uint8_t len2; 
        }datalen;
        uint16_t len;
    }lenMsg;
}headMsg_t;

typedef struct 
{
    headMsg_t headMsg;
    uint8_t protocolId;          /* 协议ID */
    uint8_t srcAddr;             /* 发送方地址 */
    uint8_t destAddr;            /* 接收方地址 */
    uint32_t serialNum;          /* 流水号 */
    uint8_t version;             /* 版本号，低四位子协议版本号，高四位预留 */
    uint8_t fragmentFlag;        /* 低四位分片标识，高四位应该策略 */
    uint8_t reserve;             /* 预留 */
    uint16_t fragmentId;         /* 报文ID */
    uint16_t fragmentOffset;     /* 分片偏移 */
    uint16_t RxFreeSize;         /* 接收缓存 */
}dataMsg_t;

#pragma pack()

typedef struct 
{
    uint16_t fragmentId;
    uint16_t fragmentOffset;
    uint8_t *dataAddr; 
    uint8_t srcAddr;
    uint8_t fragmentFlag;
    uint16_t datalen;
}vaildMsg_t;

void spi_protocol_run(void);
void dataParse(void);
void dataConsume(void);
void state_machine_run(void);
void f3f4_protocol_frame_create(vaildMsg_t* msg, uint8_t *data);

#endif
